package com.zf.multilang.security;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

//@AutoConfiguration
@Configuration
public class SecurityFilterConfig {
/*
    你遇到的 NullPointerException 是因为 objectMapper 没有被正确注入，导致 this.objectMapper 为 null。以下是解决方案和详细解释：
    在 XssFilter 中使用了 @Autowired 注入 ObjectMapper，但 XssFilter 没有被 Spring 管理，导致依赖注入失败。具体表现为：

            this.objectMapper 为 null
    调用 objectMapper.readValue() 时抛出空指针异常

        */

    // 注入 Spring 提供的 ObjectMapper
    @Autowired
    private ObjectMapper objectMapper;

    // 需要通过 FilterRegistrationBean 注册为过滤器
    @Bean
    public FilterRegistrationBean<XssFilter> xssFilter() {
        FilterRegistrationBean<XssFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new XssFilter(objectMapper));// 构造函数传入依赖
        bean.addUrlPatterns("/api/*", "/user/*","/msg/*"); // 按需配置路径
        bean.setOrder(Ordered.LOWEST_PRECEDENCE - 10); // 在 Spring Security 之前
        return bean;
    }

/*    Description:

    The bean 'xssFilter', defined in class path resource [com/zf/multilang/security/SecurityFilterConfig.class], could not be registered. A bean with that name has already been defined in file [E:\AI\study\gitee\springboot3-sample\spring-multi-language-sample\target\classes\com\zf\multilang\security\XssFilter.class] and overriding is disabled.

    Action:

    Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
    该错误表明存在 Bean名称重复定义冲突：

    冲突位置：
    SecurityFilterConfig配置类中通过@Bean方法显式定义了名为xssFilter的Bean
    XssFilter类本身可能被@Component或其他注解标记，导致Spring自动扫描注册同名Bean
    核心原因：
    当spring.main.allow-bean-definition-overriding未显式设置为true时，Spring Boot禁止Bean覆盖（默认关闭）











关键差异与选择建议
方案一：保留自动扫描注册（删除配置类中的@Bean方法）


特点：

自动注册：若XssFilter类上有@Component或@WebFilter等注解，Spring会自动注册该Filter，但 默认处理所有请求路径，无法直接指定/api/*等特定路径。
无法精细控制：自动注册的Filter默认顺序为最低优先级（Ordered.LOWEST_PRECEDENCE），无法像显式配置中通过setOrder()调整执行顺序（如确保在Spring Security之前执行）。
配置受限：无法通过代码方式动态设置初始化参数（如bean.addInitParameter()）。



适用场景：
仅需简单全局过滤，无需路径或顺序控制。



方案二：保留显式配置（删除XssFilter类上的@Component）


特点：

完全控制权：通过FilterRegistrationBean可精准指定URL模式、顺序、初始化参数等，如你代码中定义的addUrlPatterns(&quot;/api/*&quot;)和setOrder()。
灵活扩展：可在@Bean方法中注入其他依赖（如配置参数、其他Bean），动态构建Filter逻辑。
避免全局影响：限定Filter仅作用于指定路径，避免不必要的性能损耗。



优势总结：
显式配置更适合需定制化Filter的场景，尤其是需要以下操作时：

指定精确的URL匹配规则（非全局过滤）
控制Filter执行顺序（如与Spring Security集成）
动态配置初始化参数或依赖注入




本地配置的兼容性分析
根据你提供的代码片段，xssFilter()方法中通过FilterRegistrationBean设置了：

路径过滤规则（/api/*, /user/*, /msg/*）
执行顺序（Ordered.LOWEST_PRECEDENCE - 10，即早于默认Security过滤器）

若改用自动扫描注册：

这些配置将完全失效，Filter会处理所有请求且顺序不可控，可能导致与Spring Security过滤器链的冲突。
需通过额外注解（如@Order）或配置文件调整顺序，但灵活度远低于显式配置。


结论
推荐保留显式配置，并删除XssFilter类上的@Component注解，原因如下：

保障关键逻辑：显式配置中的路径过滤和顺序设定是安全防护的核心需求，不可缺失。
避免冗余注册：显式配置已覆盖所有必要功能，自动扫描注册会导致重复且无用的Bean。
未来可维护性：集中管理Filter配置更易于后续扩展或调整。





    */

}